package com.LambdaDemo;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class StreamTest {
    
    public static void test1(){
        System.out.println("===================1=========================");
        ArrayList<String> list = new ArrayList<String>();
        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");

        // 需求1：把list集合中以张开头的元素在控制台输出
        list.stream().filter(name -> name.startsWith("张")).forEach(System.out::println);
        // 需求2：把list集合中长度为3的元素在控制台输出
        list.stream().filter(name -> name.length()==2).forEach(System.out::println);
        // 需求3：把list集合中以张开头的且长度为3的元素在控制台输出
        list.stream()
                .filter(name -> name.startsWith("张"))
                .filter(name -> name.length()==2)
                .forEach(System.out::println);
    }

    //存储多个字符串元素
    public static void test2(){
        System.out.println("===================2=========================");
        // 创建一个集合，存储多个字符串元素
        ArrayList<String> list2 = new ArrayList<String>();
        list2.add("林青霞");
        list2.add("张曼玉");
        list2.add("王祖贤");
        list2.add("柳岩");
        list2.add("张敏");
        list2.add("张无忌");
        // 需求1：取前3个数据在控制台输出
        list2.stream().limit(3).forEach(System.out::println);
        // 需求2：跳过3个元素，把剩下的元素在控制台输出
        list2.stream().skip(3).forEach(System.out::println);
        // 需求3：跳过2个元素，把剩下的元素中前2个在控制台输出
        list2.stream().skip(2).limit(2).forEach(System.out::println);
    }

    //distinct
    public static void test3(){
// 创建一个集合，存储多个字符串元素
        ArrayList<String> list3 = new ArrayList<String>();
        list3.add("林青霞");
        list3.add("林青霞");
        list3.add("张曼玉");
        list3.add("张曼玉");
        list3.add("王祖贤");
        list3.add("王祖贤");
        list3.add("柳岩");
        list3.add("柳岩");
        list3.add("张敏");
        list3.add("张敏");
        list3.add("张无忌");
        list3.add("张无忌");
        // 需求1：把集合元素在控制台输出，要求字符串元素不能重复
        list3.stream().distinct().forEach(System.out::println);

    }

    //sorted
    public static void test4(){
        ArrayList<String> list = new ArrayList<String>();
        list.add("linqingxia");
        list.add("zhangmanyu");
        list.add("wangzuxian");
        list.add("liuyan");
        list.add("zhangmin");
        list.add("zhangwuji");
        // 需求1：按照字母顺序把数据在控制台输出
        list.stream()
                .sorted(Comparator.comparingInt(o -> Character.toLowerCase(o.charAt(0))))
                .forEach(System.out::println);
        // 需求2：按照字符串长度把数据在控制台输出
//        Comparator<String> compByLength = (a, b) -> -(a.length() - b.length());
        list.stream().sorted((a, b) -> -(a.length() - b.length())).forEach(System.out::println);

    }

    //map & mapToInt & mapToLong & mapToDouble
    //map 方法用于映射每个元素到对应的结果
    public static void test5(){
        // 创建一个集合，存储多个字符串元素
        ArrayList<String> list = new ArrayList<String>();
        list.add("10");
        list.add("20");
        list.add("30");
        list.add("40");
        list.add("50");
        // 需求1：将集合中的字符串数据转换为整数之后在控制台输出
        list.stream().map(Integer::parseInt).forEach(System.out::println);
        // 需求2：将集合中的字符串数据转换为Integer之后在控制台输出
        list.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
        // 需求3：将集合中的字符串数据转换为Long之后在控制台输出
        list.stream().mapToLong(Long::parseLong).forEach(System.out::println);
        // 需求4：将集合中的字符串数据转换为Double之后在控制台输出
        list.stream().mapToDouble(Double::parseDouble).forEach(System.out::println);

    }
    //统计结果
    public static void test6(){
        //forEach&forEachOrdered&count
        ArrayList<String> list = new ArrayList<String>();
        list.add("林青霞");
        list.add("张曼玉");
        list.add("王祖贤");
        list.add("柳岩");
        list.add("张敏");
        list.add("张无忌");
        // 需求1：把集合中的元素在控制台输出
        list.forEach(System.out::println);
        System.out.println("----------");

        // 需求2：把集合中的元素在控制台输出
        list.forEach(System.out::println);
        System.out.println("----------");

        // 需求3：统计集合中有几个以张开头的元素，并把统计结果在控制台输出
        long count = list.stream().filter(s -> s.startsWith("张")).count();
        System.out.println(count);


    }
    //最大值最小值
    public static void test7(){
        // 创建一个集合，存储多个整数元素
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(10);
        list.add(20);
        list.add(30);
        list.add(40);
        list.add(50);
        // 需求1：获取集合中的最大值在控制台输出
        Integer max = list.stream().max(Integer::compareTo).get();
        System.out.println(max);
        // 需求2：获取集合中的最小值在控制台输出
        Integer min = list.stream().min(Integer::compareTo).get();
        System.out.println(min);

    }


    public static void main(String[] args) {
//        test1();
//        test2();
//        test3();
//        test4();
        test5();
    }
}
